Vykonnost Threadu

Otázka od: Karel Pecinka

5. 6. 2004 23:27

Zdravim,
 
mam aplikaci, ve ktere je zobrazovan cenik. Uzivatel muze filtrovat
zaznamy podle zadaneho filtru nebo zobrazit zbozi z vybrane skupiny.
Zaznamy jsou ulozeny ve Stringlistu protoze jsou nacitany z textoveho
souboru. Z tohoto stringlistu naplnuji po kazde zmene kbMemtable.
 
Az dosud jsem nepouzival vice vlaken a rychlost vytvoreni takove tabulky
byla uspokojujici (v pripade vsech - asi 4000 zaznamu to trvalo asi 2
sekundy). Nelibilo se mi vsak, ze reakce aplikace napr. pri zmene
skupiny byla pomala - vzdy se cekalo, az se vytvori cely seznam, i kdyz
uzivatel jiz namackal klavesy a nekolikrat zmenil skupinu.
 
Predelal jsem tedy vytvareni seznamu do druheho vlakna. Aplikaci je nyni
mnohem prijemnejsi ovladat, protoze kdyz uzivatel vybere skupiny a
predchozi seznam neni jeste vytvoren, vlakno se prerusi a vytvori se
nove. Nicmene abych mohl bezpecne naplnit kbMemTable, pouzivam metodu
Synchronize. A prave kvuli ni doslo k vyraznemu zpomaleni pri vytvareni
seznamu - to co trvalo 2 sekundy trva nyni 9 sekund. Kdyz nepouzivam
Synchronize trva to opet 2 sekundy, ale pri velmi rychlem meneni filtru
aplikace vyhazuje chyby. Prioritu vlakna mam nastavenu na
tpTimeCritical.
 
Je nejaka moznost, jak zajistit uzivatelskou privetivost, tj. zpracovani
seznamu ve druhem vlaknu, a pritom neprijit o vykon jednovlaknoveho
zpracovani?
 
Diky za rady.
 
Karel

D5, WinXP

Odpovedá: Petr Vones

6. 6. 2004 11:03

From: "Karel Pecinka" <k.pecinka@seznam.cz>
> Je nejaka moznost, jak zajistit uzivatelskou privetivost, tj. zpracovani
> seznamu ve druhem vlaknu, a pritom neprijit o vykon jednovlaknoveho
> zpracovani?

S tim jak je navrzena VCL vicemene zadna. Vetsina kodu nepocita s tim ze by
byl volan z jineho thredu, proto je nutne pouzivat metodu Synchronize ktera
vykona kod v kontextu hlavniho threadu, tudiz tim mnoho neziskas.

Urcita moznost by mohla byt odpojit TDataSet, v threadu vytvorit novy a ten
pak znovu napojit na ovladaci prvky, pripadne mit dva a ty prehazovat.

Petr Vones